// Package handlers 这个包是处理前段的http请求的api服务
// 这个包里面只是写处理函数，具体的与前端地址的映射是在main.go中给出的
// 注意，api层的处理不是核心业务逻辑的处理，只是去进行调用、返回结果的
// 核心业务逻辑处理应该交给微服务来做
package handlers

import (
	"context"
	"github.com/cloudwego/hertz/pkg/app"
	"github.com/cloudwego/kitex-examples/bizdemo/easy_note/cmd/api/rpc"
	"github.com/cloudwego/kitex-examples/bizdemo/easy_note/kitex_gen/notedemo"
	"github.com/cloudwego/kitex-examples/bizdemo/easy_note/pkg/constants"
	"github.com/cloudwego/kitex-examples/bizdemo/easy_note/pkg/errno"
	"github.com/hertz-contrib/jwt"
)

// CreateNote create note info
// 这个函数处理一个http请求
// 接收两个参数，一个是ctx（上下文），一个是前端传过来的请求（一个指针类型）
// 这个函数的作用是创建一篇笔记
func CreateNote(ctx context.Context, c *app.RequestContext) {
	//初始化一个前端传过来的映射实体
	var noteVar NoteParam
	//参数解析，前端请求绑定前面这个对象noteVar
	if err := c.Bind(&noteVar); err != nil {
		//异常处流
		//第一个参数是对哪个http请求进行响应
		//第二个是异常信息
		//第三个是响应数据
		SendResponse(c, errno.ConvertErr(err), nil)
		//不再往下执行
		return
	}

	//如果程序能执行到这里
	//说明已经能把前端的body请求参数映射成我这边定义的noteVar参数了

	//先进行参数校验
	//参数校验不通过
	if len(noteVar.Title) == 0 || len(noteVar.Content) == 0 {
		//直接响应前端
		SendResponse(c, errno.ParamErr, nil)
		//不再往下执行
		return
	}

	//运用hertz的jwt框架解析c请求中的token
	claims := jwt.ExtractClaims(ctx, c)
	//根据claims获取用户信息，生成userID
	//通过rpc去调用其他微服务的时候，不再需要进行token鉴权认证，直接传userID就可以
	//具体参数怎么接收直接去看idl就行了
	userID := int64(claims[constants.IdentityKey].(float64))

	//通过rpc调用Note微服务
	//rpc包下的内容是一个调用的中间层，主要是构建调用微服务服务端的客户端！！
	//调用CreateNote函数相当于是通过这个函数创建指定rpc的客户端去访问其他微服务
	//第一个参数：context包下的BackGround函数的返回值，固定填写这个就行
	//notedemo包是kitex框架生成的包，里边的CreateNoteRequest是一个结构体，是在定义idl的时候规定好的微服务客户端的请求格式
	err := rpc.CreateNote(context.Background(), &notedemo.CreateNoteRequest{
		//填写请求格式就行了
		UserId:  userID,
		Content: noteVar.Content,
		Title:   noteVar.Title,
	})
	//直接处理异常，跟前面一样
	//这个异常是微服务调用过程中出现了错误
	if err != nil {
		SendResponse(c, errno.ConvertErr(err), nil)
		return
	}
	//程序能执行到这里，说明一直没有返回异常
	//给前端返回成功信息
	//errno.Success值是0，默认成功
	SendResponse(c, errno.Success, nil)
}
